#ifndef __T_PLACA__
#define __T_PLACA__

#include "TMensaje.h"
#include "TMedio.h"
#include "TMux.h"
#include <string.h>

#define DIR_BROADCAST 0
#define DIR_MIN 1
#define DIR_MAX 255
#define MAX_DATOS 128

#define FALSE 0
#define TRUE 1

#define PLACA_BUFFER_VACIO 0;
#define PLACA_DEBUG 0
#define PLACA_OK 0
#define PLACA_ERR_RANGO 1
#define PLACA_ERR_OVERFLOW 2
#define PLACA_ERR_DIRECCIONDISTINTA 3
#define PLACA_ERR_MEMORIA 4
#define PLACA_ERR_ENVIAR 5
#define PLACA_ERR_DIRECCION 6
#define PLACA_ERR_MUX 7
#define PLACA_ERR_MUXYACONECTADO 8
#define PLACA_ERR_MEDIOTRANSMITIR 9
#define PLACA_ERR_INESPERADO 10
#define PLACA_ERR_MUXNODESCONECTADO 11
#define PLACA_ERR_PLACACONECTADA 12
#define PLACA_ERR_MUXYATIENEPLACA 13
#define PLACA_ERR_MEDIOCONECTAR 14

#ifndef __T_MUX__
typedef struct s_mux TMux;
#endif

struct s_placa {
	TDireccion direccion;
	TMedio* medio;
	struct s_mux* mux;
	void* mensaje; /* Buffer */
	int buffer_lleno;
};

int Placa_Crear(TPlaca* placa, TDireccion dir);
int Placa_Destruir(TPlaca* placa);
TDireccion Placa_GetDireccion(TPlaca* placa);
int Placa_Recibir(TPlaca* placa, void* mensaje, size_t tam);
int Placa_Enviar(TPlaca* placa, void* mensaje, size_t tam, TDireccion destino);
size_t Placa_Leer(TPlaca* placa, void* destino);
int Placa_Conectar(TPlaca* placa, TMedio* medio);
int Placa_Desconectar(TPlaca* placa);
int Placa_ConectarMux(TPlaca* placa, struct s_mux* mux);
int Placa_DesconectarMux(TPlaca* placa);
int Placa_Recibir(TPlaca* placa, void* mensaje, size_t tam);

#endif
